﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace questao_4
{
    class Program
    {
        static String DATA_VALIDA = "valida";
        static String DATA_INVALIDA = "invalida";

        static void Main(string[] args)
        {
            Console.WriteLine("Questão 4 - Data válida");
            // Executando os testes de funcao
            Console.WriteLine("funcao( 1,  1,   13) -> " + (funcao(1, 1, 13)    == DATA_INVALIDA));
            Console.WriteLine("funcao( 1,  1, 2013) -> " + (funcao(1, 1, 2013)  == DATA_VALIDA));
            Console.WriteLine("funcao(29,  2, 2013) -> " + (funcao(29, 2, 2013) == DATA_INVALIDA));
            Console.WriteLine("funcao(-1,  2, 2013) -> " + (funcao(-1, 2, 2013) == DATA_INVALIDA));
            Console.WriteLine("funcao(29,  2, 1000) -> " + (funcao(29, 2, 1000) == DATA_INVALIDA));
            Console.WriteLine("funcao(29,  2, 1600) -> " + (funcao(29, 2, 1600) == DATA_VALIDA));
            Console.WriteLine("funcao(29,  2, 1996) -> " + (funcao(29, 2, 1996) == DATA_VALIDA));
            Console.WriteLine("funcao(31,  1, 2013) -> " + (funcao(31, 1, 2013) == DATA_VALIDA));
            Console.WriteLine("funcao(29, 13, 2013) -> " + (funcao(29, 13, 2013)== DATA_INVALIDA));
            Console.WriteLine("funcao(31,  4, 2013) -> " + (funcao(31, 4, 1996) == DATA_INVALIDA));
            Console.Write("\nDigite <ENTER>...");
            Console.ReadLine();
        }

        static String funcao(int dia, int mes, int ano)
        {
            // verifica se ano tem 4 digitos
            if (ano < 1000)
                return DATA_INVALIDA;

            // verifica se mes é fevereiro
            if (mes==2)
            {
                // verifica se dia esta entre 1-28
                if (dia > 0 && dia < 29)
                    return DATA_VALIDA;
                // verifica se dia esta acima de 29
                if (dia > 29 || dia < 1)
                    return DATA_INVALIDA;
                // dia é 29
                // verifica se ano é bisexto
                if ((ano%4==0 && ano%100!=0) || ano%400==0)
                    return DATA_VALIDA;
                else
                    return DATA_INVALIDA;
            }
            
            // meses com 31 dias
            //    janeiro = 1, março = 3, maio = 5, julho = 7, 
            //    agosto = 8, outubro = 10, dezembro = 12
            if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12)
            {
                if (dia >= 1 && dia <= 31)
                    return DATA_VALIDA;
                else
                    return DATA_INVALIDA;
            }
            // meses com 30 dias
            //     abril = 4, junho = 6, setembro = 9, novembro = 11
            if (mes == 4 || mes == 6 || mes == 9 || mes == 11)
            {
                if (dia >= 1 && dia <= 30)
                    return DATA_VALIDA;
                else
                    return DATA_INVALIDA;
            }

            return DATA_INVALIDA;
        }
    }
}
